package org.cyz.tools.core.manager;

import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;
import org.cyz.tools.common.util.ImageUtil;
import org.cyz.tools.core.ContextManager;

import java.io.IOException;
import java.net.URL;

public class StageFactory {

    private double xOffset=0;
    private double yOffset=0;

    //
    //注意：
    //    如上述代码所示，获取fxml文件的URL有两种方式，第一种方式只能将fxml文件放在文件夹中才能获取到，
    //一旦打包为jar包后，如果将fxml文件也打包进了jar文件，那么就无法获取到。
    //    第二种方式，即使打包进jar文件中，也依然能够正常获取到，所以个人推荐第二种方式访问fxml文件。
    //
    public Stage createStage(String title, int width, int height, String file) throws IOException {
        //保证窗口关闭后，Stage对象仍然存活
//        Platform.setImplicitExit(false);
        //URL url = getClass().getResource("../../../../" + file);
        URL url = StageFactory.class.getClassLoader().getResource(file);
        assert url != null;
        Parent root = FXMLLoader.load(url);
        Stage stage = new Stage();
        stage.setTitle(title);
        stage.getIcons().add(new ImageUtil().getStartIcon("logo"));
        //删除最大化最小化按钮（你可以用stage.setResizable(false)来做到这一点;您还可以使用stage.initStyle(StageStyle.UNDECORATED)删除）
        stage.initStyle(StageStyle.UNDECORATED);
        //禁止托拽边框，需要加入
        stage.setResizable(false);
        //拖动
        root.setOnMousePressed(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent event) {
                xOffset = event.getSceneX();
                yOffset = event.getSceneY();
            }
        });
        root.setOnMouseDragged(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent event) {
                stage.setX(event.getScreenX() - xOffset);
                stage.setY(event.getScreenY() - yOffset);
            }
        });

        stage.setScene(new Scene(root, width, height));
        stage.setResizable(false);
        //设置在stage关闭时需要进行的操作
        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                //此处当stage关闭时，同时结束程序，避免stage关闭后，程序界面关闭了，但后台线程却依然运行的问题
                System.exit(0);
            }
        });

        //设置系统的菜单栏
//        SystemTrayAssembly.getInstance().listen(stage);
        //初始化Stage时将该实例添加进StageManager的容器中，方便管理
//        ContextManager.stageManager.addStage(file.split("\\.")[0], stage);
        String name=file.substring(file.lastIndexOf("/")+1,file.lastIndexOf("."));
        ContextManager.stageManager.addStage(name, stage);
        return stage;
    }


}
